#!/bin/bash

# 该脚本用于从本地编译和部署 Go 应用
# 远程服务器的应用运行用户为 deployer，不具备 sudo 权限，因此 REMOTE_HOST_ALIAS 对应的用户需要具备免密 sudo 权限

set -euo pipefail

# --- 配置区 ---
# 应用名，务必更改为实际应用名！！！
APP_NAME="llm-gateway" 
# 编译输出目录，务必更改为实际目录！！！
BIN_PATH="./bin/${APP_NAME}-linux"
# 远程服务器别名(需要提前在~/.ssh/config中配置)，对应一个区别于deployer的拥有免密sudo权限用户，务必更改为实际别名！！！
REMOTE_HOST_ALIAS="tytc"
REMOTE_APP_DIR="/home/deployer/apps/$APP_NAME"
REMOTE_RELEASES_DIR="$REMOTE_APP_DIR/releases"
REMOTE_SHARED_DIR="$REMOTE_APP_DIR/shared"
REMOTE_CURRENT_LINK="$REMOTE_APP_DIR/current"
# 保留历史版本数
RELEASES_TO_KEEP=5
# --- 配置区结束 ---

function deploy() {
  # 远程临时目录
  REMOTE_TMP_DIR=""

  # 定义一个安全的清理函数
  function cleanup() {
    # 使用安全的参数扩展 `${VAR:-}` 来避免 unbound variable 错误
    # 只有当 REMOTE_TMP_DIR 变量被成功赋值（非空）时，才执行清理
    if [[ -n "${REMOTE_TMP_DIR:-}" ]]; then
      echo ">> 清理远程临时目录: $REMOTE_TMP_DIR"
      ssh "$REMOTE_HOST_ALIAS" "rm -rf $REMOTE_TMP_DIR"
    fi
  }

  # 设置 trap 在脚本退出时调用 cleanup 函数
  trap cleanup EXIT

  echo "--- 开始部署 $(date) ---"

  local release_timestamp
  release_timestamp=$(date +"%Y%m%d_%H%M%S")

  # 确保远程应用目录存在
  ssh "$REMOTE_HOST_ALIAS" "sudo mkdir -p $REMOTE_RELEASES_DIR $REMOTE_SHARED_DIR ${REMOTE_RELEASES_DIR}/$release_timestamp"

  # 远程创建临时目录
  echo ">> 创建远程临时目录..."
  REMOTE_TMP_DIR=$(ssh "$REMOTE_HOST_ALIAS" "mktemp -d")
  if [ -z "$REMOTE_TMP_DIR" ]; then
    echo ">> 错误: 无法在远程服务器上创建临时目录"
    exit 1
  fi

  # 上传二进制文件到远程服务器
  echo ">> 上传二进制文件到远程服务器..."
  rsync -avz "$BIN_PATH" "$REMOTE_HOST_ALIAS:$REMOTE_TMP_DIR/$APP_NAME"
  ssh "$REMOTE_HOST_ALIAS" "sudo mv $REMOTE_TMP_DIR/$APP_NAME $REMOTE_RELEASES_DIR/$release_timestamp/"

  # 检查共享目录中的配置文件是否存在，没有则从本地写入
  if ! ssh "$REMOTE_HOST_ALIAS" "sudo test -f $REMOTE_SHARED_DIR/config.toml"; then
    echo ">> 共享目录中的 config.toml 文件不存在，从本地写入..."
    if [ ! -f "./deployment/config.toml" ]; then
      echo ">> 错误：未找到本地配置文件 deployment/config.toml，请确保该文件存在"
      exit 1
    fi
    # 上传配置文件到远程临时目录
    echo ">> 上传配置文件到远程临时目录..."
    rsync -avz "./deployment/config.toml" "$REMOTE_HOST_ALIAS:$REMOTE_TMP_DIR/config.toml"
    echo ">> 移动配置文件到共享目录..."
    ssh "$REMOTE_HOST_ALIAS" "sudo mv $REMOTE_TMP_DIR/config.toml $REMOTE_SHARED_DIR/config.toml"
    # 确保 config.toml 文件权限正确
    ssh "$REMOTE_HOST_ALIAS" "sudo chmod 644 $REMOTE_SHARED_DIR/config.toml"
  else
    echo ">> 共享目录中的配置文件已存在，跳过上传"
  fi

  # 创建配置文件软链接到共享目录
  echo ">> 创建配置文件软链接到共享目录..."
  ssh "$REMOTE_HOST_ALIAS" "sudo ln -snf $REMOTE_SHARED_DIR/config.toml $REMOTE_RELEASES_DIR/$release_timestamp/config.toml"

  # 切换 current 软链接
  echo ">> 切换当前版本软链接..."
  ssh "$REMOTE_HOST_ALIAS" "sudo ln -snf $REMOTE_RELEASES_DIR/$release_timestamp $REMOTE_CURRENT_LINK"

  # 赋予执行权限
  echo ">> 赋予执行权限..."
  ssh "$REMOTE_HOST_ALIAS" "sudo chmod +x $REMOTE_RELEASES_DIR/$release_timestamp/$APP_NAME"

  # 修改应用目录权限
  echo ">> 修改应用目录权限..."
  ssh "$REMOTE_HOST_ALIAS" "sudo chown -R deployer:deployer $REMOTE_APP_DIR"

  # 清理旧版本
  echo ">> 清理旧版本..."
  ssh "$REMOTE_HOST_ALIAS" "sudo bash -c 'cd $REMOTE_RELEASES_DIR && ls -dt */ | tail -n +$((RELEASES_TO_KEEP + 1)) | xargs rm -rf'"

  # 检查并创建 systemd 服务
  if ! ssh "$REMOTE_HOST_ALIAS" "sudo systemctl cat $APP_NAME" &>/dev/null; then
    echo ">> 创建 systemd 服务文件..."
    if [ -f "deployment/systemd.service" ]; then
      rsync -avz "deployment/systemd.service" "$REMOTE_HOST_ALIAS:$REMOTE_TMP_DIR/$APP_NAME.service"
      ssh "$REMOTE_HOST_ALIAS" "sudo mv $REMOTE_TMP_DIR/$APP_NAME.service $REMOTE_SHARED_DIR/$APP_NAME.service"
      ssh "$REMOTE_HOST_ALIAS" "sudo ln -sf $REMOTE_SHARED_DIR/$APP_NAME.service /etc/systemd/system/$APP_NAME.service"
      ssh "$REMOTE_HOST_ALIAS" "sudo systemctl daemon-reload"
      echo ">> 启动并启用 systemd 服务..."
      ssh "$REMOTE_HOST_ALIAS" "sudo systemctl start $APP_NAME"
      ssh "$REMOTE_HOST_ALIAS" "sudo systemctl enable $APP_NAME"
    else
      echo ">> 未找到 systemd 服务文件，请确保 deployment/systemd.service 存在"
      exit 1
    fi
  else
    echo ">> 重启应用..."
    ssh "$REMOTE_HOST_ALIAS" "sudo systemctl restart $APP_NAME"
  fi

  echo "--- 部署完成 $(date) ---"
}

deploy

